/**
 * 格式化文件大小
 * @param {number|string} bytes - 文件大小（字节数）
 * @param {number} [decimals=2] - 保留小数位数
 * @returns {string} 格式化后的字符串（自动选择最佳单位）
 */
function formatFileSize(bytes, decimals = 2) {
  if (bytes === 0) return "0 Bytes"

  const k = 1024
  const dm = decimals < 0 ? 0 : decimals
  const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"]

  const i = Math.floor(Math.log(bytes) / Math.log(k))

  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i]
}

// 使用示例
console.log(formatFileSize(500)) // "500 Bytes"
console.log(formatFileSize(1024)) // "1 KB"
console.log(formatFileSize(1536)) // "1.5 KB"
console.log(formatFileSize(1048576)) // "1 MB"
console.log(formatFileSize(1073741824)) // "1 GB"

/**
 * 增强版文件大小格式化
 * @param {number|string} bytes - 文件大小（字节数）
 * @param {Object} [options] - 配置选项
 * @param {number} [options.decimals=2] - 保留小数位数
 * @param {string[]} [options.units] - 自定义单位数组
 * @param {number} [options.k=1024] - 计算基数（1024或1000）
 * @param {boolean} [options.spacer=true] - 是否在数字和单位间加空格
 * @returns {string} 格式化后的字符串
 */
function formatFileSizeEnhanced(
  bytes,
  {
    decimals = 2,
    units = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
    k = 1024,
    spacer = true,
  } = {}
) {
  if (isNaN(parseFloat(bytes)) || !isFinite(bytes)) {
    throw new Error("Invalid file size value")
  }

  if (bytes === 0) return "0" + (spacer ? " " : "") + units[0]

  const dm = decimals < 0 ? 0 : decimals
  const i = Math.floor(Math.log(bytes) / Math.log(k))

  const separator = spacer ? " " : ""
  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm) + separator + units[i])
}

// 使用示例
console.log(formatFileSizeEnhanced(1536))
// "1.5 KB"

console.log(formatFileSizeEnhanced(1536, { k: 1000 }))
// "1.54 KB" (使用1000为基数)

console.log(
  formatFileSizeEnhanced(1073741824, {
    units: ["B", "K", "M", "G"],
    spacer: false,
  })
)
// "1G"

console.log(
  formatFileSizeEnhanced(123456789, {
    decimals: 0,
  })
)
// "118 MB"
